﻿using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using BaseData.Models;

namespace BaseData.Exts
{
    public class AddOrUpdate
    {
        public class Web_Base_Account_User_Action
        {
            /// <summary>
            /// 可以更新主表和子表（一个或多个）
            /// </summary>
            /// <param name="ctx">Context</param>
            /// <param name="txtInfoId">InfoID（隐藏控件标注）</param>
            /// <param name="master">主表</param>
            public void Save(ContextExt ctx, HiddenField txtInfoId, List<Web_Base_Account_User> master)
            {
                Save(ctx, txtInfoId, master, null);
            }
            /// <summary>
            /// 可以更新主表和子表（一个或多个）
            /// </summary>
            /// <param name="ctx">Context</param>
            /// <param name="txtInfoId">InfoID（隐藏控件标注）</param>
            /// <param name="master">主表</param>
            /// <param name="slaver">子表（封装了多个类，在条件选择中分别使用）</param>
            public static void Save(ContextExt ctx, HiddenField txtInfoId, List<Web_Base_Account_User> master, ContextExt slaver)
            {
                try
                {
                    /// 主表数据处理
                    master.ForEach(f => ctx.Web_Base_Account_User.AddOrUpdate(m => m.PkId, f));//根据当前类的pkID，自动决定Action类型：Add or Update。子类同理。
                    ctx.SaveChanges();
                    if (!master.Any()) return;
                    var webGzfInfo = master.FirstOrDefault();
                    if (webGzfInfo != null)
                        txtInfoId.Value = webGzfInfo.PkId.ToString(CultureInfo.InvariantCulture);//POST后给隐藏控件赋值，用作判断是否重复POST。
                    /// 根据主表对子表数据处理（子表可能有多个，根据switch来进行选择）。
                    master.ForEach(f =>
                    {
                        /// 这里可以不用enum而通过依赖注入、控制反转和override来实现类功能的扩展。
                        /// var slaverRent = slaver.Web_Base_Fund_Coin.ToList();
                        /// slaverRent.ForEach(g =>
                        /// {
                        ///     g.PkId = f.PkId;
                        ///     g.PkId = f.PkId;
                        ///     g.FlagStatus = 0;
                        ///     ctx.Web_Base_Fund_Coin.AddOrUpdate(s => new { s.PkId, }, g);
                        /// });
                    });
                    ctx.SaveChanges();
                }
                catch (Exception err)
                {
                    throw new ArgumentException("错误：" + err.Message);
                }
            }
        }
    }
}
